/*****************************************************************************************
 * ETS
 * 
 * Cours:		LOG121
 * Session:		A2013
 * Groupe:		04
 * Projet:		Laboratoire #4
 * Etudiants:	Frederic-Simon Mimeault
 * 				Francisco Felipe Quilodran
 * 				Guillaume Longtin
 * 				William Proulx
 * 
 * Professeur:	Francis Cardinal
 * 
 * Fichier:		Perspective.java
 *
 * Date de creation:	2013-11-23
 * Date dern. modif.:	2013-11-26
 * ****************************************************************************************
 * Historique des modifications
 * ****************************************************************************************
 * 2013-11-23 Version initiale
 * 2013-11-26 Implémentation de transposer / zoomer
 *****************************************************************************************/

package modele;

import java.io.Serializable;
import java.util.Observable;

/**
 * Cette classe est le modèle Perspective qui représente une image ou une portion de l'image
 * selon ses coordonnées et son échelle.
 * Elle hérite de la classe Observable pour permettre de notifier la vue d'un changement.
 * C'est le patron de conception Observateur qui est mis en place dans cette classe.
 * @author trauko
 *
 */
public class Perspective extends Observable implements Cloneable, Serializable {

	private static final long serialVersionUID = 848351911605942683L;
	
	private int echelle;
	private int coordonneeX;
	private int coordonneeY;
	private int limiteX;
	private int limiteY;
	
	/**
	 * Constructeur de la classe Perspective qui permet de construire une perspective de l'image.
	 * @param echelle
	 * @param coordonneeX
	 * @param coordonneeY
	 * @param limiteX
	 * @param limiteY
	 */
	public Perspective(int echelle, int coordonneeX, int coordonneeY, int limiteX, int limiteY) {
		
		this.echelle = echelle;
		this.coordonneeX = coordonneeX;
		this.coordonneeY = coordonneeY;
		this.limiteX = limiteX;
		this.limiteY = limiteY;
		
	}

	/**
	 * Mutateur qui modifie les coordonnées de la perspective avec celle reçus en paramètre.
	 * @param modificationX
	 * @param modificationY
	 */
	public void transposer(int modificationX, int modificationY) {
		
		this.coordonneeX += ((modificationX + coordonneeX) < 0) ? 0 : ((modificationX + coordonneeX) > limiteX) ? limiteX : modificationX;
		this.coordonneeY += ((modificationY + coordonneeY) < 0) ? 0 : ((modificationY + coordonneeY) > limiteY) ? limiteY : modificationY;
		this.setChanged();
		this.notifyObservers();
		
	}

	/**
	 * Mutateur qui modifie l'échelle de la perspective avec celle reçue en paramètre.
	 * @param modificationEchelle
	 */
	public void zoomer(int modificationEchelle) {
		
		this.echelle += modificationEchelle;
		this.setChanged();
		this.notifyObservers(this);
		
	}

	/**
	 * Accesseur qui retourne la limite de la coordonnée X.
	 * @return
	 */
	public int getLimiteX() {
		
		return this.limiteX;
		
	}
	
	/**
	 * Accesseur qui retourne la limite de la coordonné Y.
	 * @return
	 */
	public int getLimiteY() {
		
		return this.limiteY;
		
	}
	
	/**
	 * Mutateur qui modifie la limite de la coordonnée X avec celle reçue en paramètre.
	 * @param limiteX
	 */
	public void setLimiteX(int limiteX) {
		
		this.limiteX = limiteX;
		
	}
	
	/**
	 * Mutateur qui modifie la limite de la coordonnée Y avec celle reçue en paramètre.
	 * @param limiteY
	 */
	public void setLimiteY(int limiteY) {
		
		this.limiteY = limiteY;
		
	}

	/**
	 * Accesseur qui retourne l'échelle de la perspective
	 * @return the echelle
	 */
	public int getEchelle() {
		
		return echelle;
		
	}


	/**
	 * Mutateur qui modifie l'échelle de la perspective avec celle reçue en paramètre.
	 * @param echelle the echelle to set
	 */
	public void setEchelle(int echelle) {
		
		this.echelle = echelle;
		
	}

	/**
	 * Accesseur qui retourne la coordonnée X.
	 * @return the coordonneeX
	 */
	public int getCoordonneeX() {
		
		return coordonneeX;
		
	}

	/**
	 * Mutateur qui modifie la coordonnée X avec celle reçue en paramètre.
	 * @param coordonneeX the coordonneeX to set
	 */
	public void setCoordonneeX(int coordonneeX) {
		
		this.coordonneeX = coordonneeX;
		
	}

	/**
	 * Accesseur qui retourne la coordonnée Y.
	 * @return the coordonneeY
	 */
	public int getCoordonneeY() {
		
		return coordonneeY;
	}
	
	/**
	 * Méthode qui permet de notifier les observateurs des changements effectués.
	 */
    public void notifier() {
    	
    	this.setChanged();
    	this.notifyObservers(this);
    	
    }
    
	/**
	 * @param coordonneeY the coordonneeY to set
	 */
	public void setCoordonneeY(int coordonneeY) {
		
		this.coordonneeY = coordonneeY;
		
	}
	
	/**
	 * Méthode qui permet de réinitialiser les données de la perspective avec les valeurs de défauts.
	 */
	public void setdefault() {
		
		this.coordonneeY = 0;
		this.coordonneeX = 0;
		this.echelle = 100;

	}
}

